package com.edu.exam.entity.system.storage;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 备份记录实体类
 * 所属模块：系统支持模块
 * 对应数据库表：backup_record
 *
 * <p>备份记录实体用于管理试卷存储系统的数据备份操作，支持备份创建、
 * 状态跟踪、备份恢复等功能。是试卷存储与版本控制的安全保障组件。</p>
 *
 * <p>核心功能：
 * - 备份管理：管理备份的类型、路径、大小等信息
 * - 状态跟踪：跟踪备份操作的执行状态
 * - 备份验证：验证备份数据的完整性和可用性
 * - 备份历史：记录备份操作的完整历史
 * - 恢复支持：支持基于备份记录的数据恢复</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class BackupRecord {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 备份类型
     *
     * <p>备份的类型标识。
     * 支持的类型包括：FULL（完整备份）、INCREMENTAL（增量备份）、DIFFERENTIAL（差异备份）。</p>
     */
    @Column(name = "backup_type", nullable = false, length = 20)
    private String backupType;

    /**
     * 备份文件路径
     *
     * <p>备份文件的完整存储路径。
     * 包含目录和文件名的完整路径。</p>
     */
    @Column(name = "backup_path", nullable = false, length = 500)
    private String backupPath;

    /**
     * 备份大小
     *
     * <p>备份文件的大小，单位为字节。
     * 用于存储空间统计和管理。</p>
     */
    @Column(name = "backup_size", nullable = false)
    private Long backupSize;

    /**
     * 备份时间
     *
     * <p>备份操作的执行时间。
     * 记录备份是何时开始的。</p>
     */
    @Column(name = "backup_time", nullable = false)
    private LocalDateTime backupTime;

    /**
     * 备份人
     *
     * <p>执行备份操作的人员。
     * 记录是谁执行了这次备份。</p>
     */
    @Column(name = "backup_by", nullable = false, length = 50)
    private String backupBy;

    /**
     * 备份状态
     *
     * <p>备份操作的状态标识。
     * 支持的状态包括：IN_PROGRESS（进行中）、SUCCESS（成功）、FAILED（失败）、CANCELLED（已取消）。</p>
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status = "IN_PROGRESS";

    /**
     * 备份说明
     *
     * <p>备份操作的详细说明。
     * 描述备份的目的、范围等信息。</p>
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * 完成时间
     *
     * <p>备份操作的完成时间。
     * 记录备份是何时完成的。</p>
     */
    @Column(name = "completion_time")
    private LocalDateTime completionTime;

    /**
     * 备份耗时
     *
     * <p>备份操作所花费的时间，单位为毫秒。
     * 用于性能分析和优化。</p>
     */
    @Column(name = "duration")
    private Long duration;

    /**
     * 备份范围
     *
     * <p>备份的数据范围（JSON格式）。
     * 包含备份的试卷ID范围、时间范围等信息。</p>
     */
    @Column(name = "backup_scope", columnDefinition = "TEXT")
    private String backupScope;

    /**
     * 备份配置
     *
     * <p>备份操作的配置参数（JSON格式）。
     * 包含压缩设置、加密设置等配置信息。</p>
     */
    @Column(name = "backup_config", columnDefinition = "TEXT")
    private String backupConfig;

    /**
     * 压缩算法
     *
     * <p>备份文件使用的压缩算法。
     * 例如：ZIP、GZIP、7Z等。</p>
     */
    @Column(name = "compression_algorithm", length = 20)
    private String compressionAlgorithm;

    /**
     * 压缩前大小
     *
     * <p>数据压缩前的原始大小，单位为字节。
     * 用于计算压缩比。</p>
     */
    @Column(name = "original_size")
    private Long originalSize;

    /**
     * 压缩比
     *
     * <p>数据压缩的比例，百分比形式。
     * 例如：60.0表示压缩到原大小的60%。</p>
     */
    @Column(name = "compression_ratio")
    private Double compressionRatio;

    /**
     * 校验和
     *
     * <p>备份文件的校验和。
     * 用于验证备份文件的完整性。</p>
     */
    @Column(name = "checksum", length = 100)
    private String checksum;

    /**
     * 备份标签
     *
     * <p>备份的标签说明。
     * 用于快速识别备份的目的和内容。</p>
     */
    @Column(name = "backup_label", length = 100)
    private String backupLabel;

    /**
     * 关联备份ID
     *
     * <p>关联的基础备份ID（用于增量备份）。
     * 指向此次备份所基于的基础备份。</p>
     */
    @Column(name = "base_backup_id")
    private Long baseBackupId;

    /**
     * 备份文件数量
     *
     * <p>备份包含的文件数量。
     * 用于统计备份的文件数量。</p>
     */
    @Column(name = "file_count")
    private Integer fileCount;

    /**
     * 验证状态
     *
     * <p>备份验证的状态。
     * 支持的状态包括：PENDING（待验证）、VERIFIED（已验证）、FAILED（验证失败）。</p>
     */
    @Column(name = "verification_status", length = 20)
    private String verificationStatus;

    /**
     * 验证时间
     *
     * <p>备份验证的时间。
     * 记录备份是何时验证的。</p>
     */
    @Column(name = "verification_time")
    private LocalDateTime verificationTime;

    /**
     * 验证人
     *
     * <p>执行备份验证的人员。
     * 记录是谁验证了这个备份。</p>
     */
    @Column(name = "verified_by", length = 50)
    private String verifiedBy;

    /**
     * 保留期限
     *
     * <p>备份文件的保留期限。
     * 过期后备份文件可能被自动清理。</p>
     */
    @Column(name = "retention_period")
    private Integer retentionPeriod; // 天数

    /**
     * 过期时间
     *
     * <p>备份文件的过期时间。
     * 过期后备份文件将被标记为可清理。</p>
     */
    @Column(name = "expiry_time")
    private LocalDateTime expiryTime;

    /**
     * 恢复次数
     *
     * <p>基于此备份的恢复次数统计。
     * 用于备份的有效性分析。</p>
     */
    @Column(name = "restore_count")
    private Integer restoreCount = 0;

    /**
     * 最后恢复时间
     *
     * <p>最后一次基于此备份进行恢复的时间。</p>
     */
    @Column(name = "last_restore_time")
    private LocalDateTime lastRestoreTime;

    /**
     * 错误信息
     *
     * <p>备份失败时的错误信息。
     * 用于问题诊断和解决。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 备份元数据
     *
     * <p>备份操作的元数据信息（JSON格式）。
     * 包含环境信息、系统版本等元数据。</p>
     */
    @Column(name = "backup_metadata", columnDefinition = "TEXT")
    private String backupMetadata;

    /**
     * 是否自动备份
     *
     * <p>标识是否为自动执行的备份。
     * true表示自动备份，false表示手动备份。</p>
     */
    @Column(name = "is_automatic")
    private Boolean isAutomatic = false;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 备份类型常量
    /** 备份类型 - 完整备份 */
    public static final String TYPE_FULL = "FULL";

    /** 备份类型 - 增量备份 */
    public static final String TYPE_INCREMENTAL = "INCREMENTAL";

    /** 备份类型 - 差异备份 */
    public static final String TYPE_DIFFERENTIAL = "DIFFERENTIAL";

    // 备份状态常量
    /** 备份状态 - 进行中 */
    public static final String STATUS_IN_PROGRESS = "IN_PROGRESS";

    /** 备份状态 - 成功 */
    public static final String STATUS_SUCCESS = "SUCCESS";

    /** 备份状态 - 失败 */
    public static final String STATUS_FAILED = "FAILED";

    /** 备份状态 - 已取消 */
    public static final String STATUS_CANCELLED = "CANCELLED";

    // 验证状态常量
    /** 验证状态 - 待验证 */
    public static final String VERIFICATION_PENDING = "PENDING";

    /** 验证状态 - 已验证 */
    public static final String VERIFICATION_VERIFIED = "VERIFIED";

    /** 验证状态 - 验证失败 */
    public static final String VERIFICATION_FAILED = "FAILED";
}